package com.lab.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/*
* 1.整合mybatis plus
*       1）导入依赖
*       2）配置
*            1.配置数据源
*               1.导入数据库驱动
* 3             2.在yaml配置信息
*            2.配置mybatis-plus
*                  1）使用mapperscan
*                   2）告诉plus 。sql映射文件在哪里
*
* 2.逻辑删除  已经ok主要是前端的catid的返回
* 3.JSR303 做后端的数据检验
*   1.給Bean添加校验注解，validation.constraints，并定义自己的message提示
*   2.开启校验功能@valid ,在校验错误后会有默认的响应
*   3.給校验的bean后紧跟一个bindingResults就可以获得校验的结果
*   4.分组校验
*         groups = {AddGroup.class,UpdateGroup.class}
*       1）給校验注解标注什么情况需要进行校验
*       2）@Validated({AddGroup.class})
*       3) 默认没有指定分组的校验注解@NotBlank，在分组校验的时候不生效，只会在不分组的时候生效
*   5.自定义校验
*       1)编写一个自定义的校验注解
*       2）编写一个自定义的校验器ConstraintValidator
*       3) 关联自定义的校验器和自定义的校验注解
*       @Documented
        @Constraint(validatedBy = {ListValueConstraintValidator.class })可以指定多个不同的校验器，适配多个不同的
        @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
        @Retention(RUNTIME)
* 4.统一的数据校验异常处理
*   @ControllerAdvice
*       1).编写异常处理类，使用@ControllerAdvice
*       2).使用@ExceptionHandler标注方法可以处理的异常
*5.模板引擎
*   1)thymeleaf-starter:关闭缓存，开发期间可以试试看到数据
*   2)静态资源都放在static文件夹下可以直接访问路劲访问
*   3）页面放在templates下，直接访问
*       SpringBoot,访问项目的时候，默认会找到index
*    4）页面修改不重启服务器实时更新
*           1.映入dev-tools
*
* 6.整合redis
* 1).引入data-redis-starter
* 2),简单配置redis的host等信息
* 3）使用springboot自动配置好对的stringredistemplate来操作redis
*       redis->map:存放数据key，数据值value
* 7.整合redisson作为分布式锁等功能框架
*   1）引入依赖
*   2）配置redisson
*              MyredissonConfig給容器中配置一个RedissonClient实例而已
*   3）使用，参照文档
* 8.整合SpringCache简化缓存开发
*      1，引入依赖spring-boot-starter-cache、pring-boot-starter-redis
*      2.写配置
*           1。自动配置了那些
*                   CacheAutoConfiguration会导入RedisCacheConfiguration自动配好了缓存管理器RedisCacheManager
*           2.配置使用redis作为缓存
                spring.cache.type=redis
       3.测试使用缓存
*           @Cacheable：触发讲数据保存到缓存的操作
*           @CacheEvict:触发将数据从缓存删除的操作
*           @CachePut： 不影响方法
*              1.开启缓存功能@EnableCaching
*               2.只需要使用注解就能完成使用缓存
*      4.原理：
          CacheAutoConfiguration -> RedisCacheConfiguration
          * 自动化配置了rediscachemanager->初始化所有的缓存->每个缓存决定使用说明配置
          * ->如果rediscachemanager有就用已有的，没有1就用默认配置
          * ->想改缓存对的配置，只需要在容器中放一个RedisCacheConfiguration即可
          * ->就会应用到当前RedisCacheManager管理的所有分区
*
* */

@EnableRedisHttpSession
@EnableCaching
@MapperScan("com.lab.gulimall.product.dao")
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.lab.gulimall.product.feign")
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
